庞大规模的数据流引擎(Large-Scale Dataflow Engines)
由 Peter Bailis 介绍
被选中的论文
Jeff Dean and Sanjay Ghemawat. MapReduce: Simplified Data Processing on Large Clusters. OSDI, 2004.
回首过去十年,数据管理领域发展不息,MapReduce和其随后的大规模数据处理系统无疑是最具有颠覆性与争议性的。廉价的商业存储与稳步增长的数据容量,使得不少互联网供应商摒弃了传统的数据库系统和数据仓库系统,转而根据自己的需要,构建自定义的引擎。谷歌围绕大规模系统所推出的一系列产品,涵盖谷歌文件系统[^10],MapReduce,Chubby[^6]以及 BigTable[^7],在市场里面最负盛名与最具影响。而在几乎所有的情况下面,这些新自主研发的系统,都对传统数据库中包括高(抽象)层次编程语言,查询优化,以及极具效率的执行策略在内的一小部分的特性进行了实现。由此,这些系统以及随后到来的开源 Hadoop 生态系统,在许多开发者当中变得流行起来。这就使得许多投资,市场,研究热点以及开发同时倾注到这些平台之中。不过截至目前,这些平台依旧处于不断的变化之中,同时作为一个生态系统,开始向着类传统数据仓库演变 --- 并且做了很多重要的调整。我们将在这里,就这些趋势进行反思。
历史与继任者(History and Successors)
我们所选择的第一篇读物,是Google在2004年发布的 MapReduce 。这是一个为处理谷歌规模分布式数据,而构建出来的简化版本并行查询分布式库,着重关注从抓取的页面当中重建数据索引。而在(MapReduce诞生的)那个时候,传统数据仓库并不能处理这种程度的工作负载。
而相较于传统的数据仓库,MapReduce提供了一个相当低层次的接口(两阶段数据库流,two-stage dataflow),这个接口与容错性密切相关(在两阶段数据流中终止物化操作)。同样重要的事情在于,MapReduce 被设计为一个并行编程函数库,而不是端到端的数据仓库解决方案;举例来说,MapReduce 依托了谷歌的文件系统来构建自身的存储。而在当时,数据库社区的许多成员,纷纷谴责这种架构,简单,毫无效率,以及应用场景狭隘[^8]。
尽管原版的MapReduce发布于2003年,但直到2006年之前,与MapReduce有关的Google外部活动依旧非常低迷。而在2006年,伴随着雅虎的开源MapReduce实现方案Hadoop推出。外部世界的兴趣迅速聚焦而来:一年之内,包括Dryad(微软公司)[^15],Hive(脸书公司)[^26],Pig(雅虎公司)[^22]等一系列项目都启动了研发。这些系统,我们都称之为后MapReduce系统,它们在开发群体当中魅力非凡 --- 它们主要集中于硅谷 --- 伴随着巨量的风险投资。跨系统、数据库以及网络社区,调查研究了包括调度计划,排队者缓解(straggler mitigation),容错,以及用户自定义查询优化,以及可替代编程模型等在内的诸多议题。
到了最近,后MapReuce时代的系统们对它们的接口以及功能展开了包括复杂性声明接口,查询优化策略,高性能运行时在内的诸多拓展工作。并在今天实现了越来越多的传统关系型数据库功能集。新一代的数据处理引擎,如Spark[^27],F1[^24],Impala[^16],Tex[^1],Naiad[^21],Flink/Stratosphere[^2],AsterixDB[^3],以及Drill[^14]已经构建出高层次的诸如SQL这样的查询语言来,同时赋予了它们处理通用图数据操作符,索引,以及其它可用的结构化数据输入源的能力。在Hadoop生态系统中,数据流引擎已经成为了如SQL[^4],[^26],图数据处理[^12],[^19],机器学习[^11],[^25]在内的一系列高级功能以及声明式接口的基石。
人们对于流数据的处理也是越发兴趣蓬勃,业界重新审视了2000年之后在数据库社区里面提出来的许多前沿概念。而许多成长中的商业社区与开源社区都对结构化的,以及半结构化的数据输入源的“连接器”(connectors),目录功能(如HCatalog),数据服务和有限事务处理能力(如HBase)做了开发。尽管这些社区框架的许多功能(如查询优化器)相较于不少成熟的商用数据库,依旧显得初级,但是其进步照样神速。
DryadLINQ是我们在这个篇章中,选择好的第二篇阅读材料,它最为有趣的地方可能就是它的接口:它是一组为数据处理而准备好的嵌入式语言绑定工具,集成了微软公司的.NET LINQ 接口,提供了并行化的搜集数据库。DryadLINQ通过早期的 Dryad 系统[^15]来执行查询,依托基于重放的容错机制为运行时抽象数据流图实现了运行时。当 DryadLINQ 依旧限制程序员们展开一些无副作用的数据集转换工作(包括“类SQL”操作符),但是它依旧提供出了一个抽象层次远高于MapReduce的接口。DryadLINQ 的语言独立性(与具体编程语言无关),轻量级容错性,以及基本的查询优化技术对随后包括 Apache Spark[^27],微软 Naiad[^21]在内的数据流系统,发挥了重要的影响。
影响与遗产
很难再 次发生的 MapReduce 现象至少给我们今天的世界,带来了至少三个延续至今的影响。这些情况 --- 就如同分布式数据流本身 --- 不一定新颖,但是后MapReduce时代的系统已经广泛地拓展了它们的影响:
- 模式的灵活性
这可能就是最为重要的影响,传统的数据流仓库系统,是盖上了墙的花园:它们所输入的数据,是原始的,精心策划过的,以及体系化的。而相对的,MapReduce 系统提供的是抽象好的结构化数据,而无论其处于干净状态,还是混沌状态(whether clean or dirty),精心加工过,还是没有处理过(curated or not)。它们的加载顺序,并不需要遵循一定的步骤。这也就意味着,用户可以在思考拿数据去做什么之前,就把它们存储进来。而当我们与实际情况比较之后,这种类型的存储(比如,Hadoop 的文件系统之中)就比传统的数据仓库更为廉价,因为用户存储数据的时间,可以长得多。这也是导致用户从传统的数据仓库迁徙出来,以及“大数据”迅速取得增长的一个关键性因素。不断增长着的存储格式(比如,Avro,Parquet,RCFile),将半结构化的数据同那些先进前沿的,诸如列布局相结合起来。相对于 XML,这种新的半结构化的数据的浪潮,更加具有灵活性。作为一个结果,提取-转换-装载(extract-transform-load,ETL)成为了后MapReduce引擎的主要工作负载。在各个层级上面,无论是数据分析师,到程序员,到供应商,无论如何去强调模式灵活性都不为过,因为我们深信在未来这将会变得更加重要。不过,这种多元性代价并不是完全免费的:策划类似于“数据湖”(data lakes)的行为非常昂贵(甚至远远多于存储),而我们将会在第十二章中就这个话题展开详细的讨论。 - 接口的灵活性